package com.internetCafes.spms.web.customer.bizservice.impl.dict;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.internetCafes.spms.common.utils.entity.page.PageItemDTO;
import com.internetCafes.spms.common.utils.entity.page.PageItemUtil;
import com.internetCafes.spms.common.utils.entity.page.PageItemVO;
import com.internetCafes.spms.core.exception.RRException;
import com.internetCafes.spms.core.exception.RRExceptionCodeEnum;
import com.internetCafes.spms.web.customer.bizservice.dict.IEntDictBizService;
import com.internetCafes.spms.web.customer.common.cont.EntDictValueConst;
import com.internetCafes.spms.web.customer.entity.dict.EntDictValue;
import com.internetCafes.spms.web.customer.model.dict.*;
import com.internetCafes.spms.web.customer.service.dict.IEntDictValueService;
import com.sms.common.util.hutool.core.collection.CollectionUtil;
import com.sms.common.util.hutool.core.util.ObjectUtil;
import com.sms.common.util.hutool.core.util.StrUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class EntDictBizServiceImpl implements IEntDictBizService {

    @Autowired
    private IEntDictValueService dictValueService;

    /**
     * 通过id启用字典表值
     * @param idList id列表
     */
    @Override
    public boolean enableValueByIdList(@Validated @NotEmpty List<Long> idList) {
        return dictValueService.updateStatus(idList, EntDictValueConst.Status.ENABLE.getId());
    }

    /**
     * 通过id禁用字典表值
     * @param idList id列表
     */
    @Override
    public boolean disableValueByIdList(@Validated @NotEmpty List<Long> idList) {
        return dictValueService.updateStatus(idList, EntDictValueConst.Status.DISABLE.getId());
    }



    /**
     * 字典表信息更新
     * @param req 请求参数
     * @return 返回是否更新成功
     */
    @Override
    public boolean updateValue(EntDictValueConfigReq req) {
        if (ObjectUtil.isNull(req.getId()) || StrUtil.isBlank(req.getDictCode()) || StrUtil.isBlank(req.getName())) {
            throw new RRException(RRExceptionCodeEnum.PARAM_ERROR);
        }
        // 字典表名称唯一字段  当我只修改orderid时会出现数据重复异常
        List<EntDictValue> dictValueList = dictValueService.list(
                new LambdaQueryWrapper<EntDictValue>()
                        .eq(EntDictValue::getDictCode, req.getDictCode())
                        .eq(EntDictValue::getName, req.getName())
                        .ne(EntDictValue::getId, req.getId()));

        if (CollectionUtil.isNotEmpty(dictValueList)) {
            throw new RRException(RRExceptionCodeEnum.ENT_DICT_VALUE_EXIST);
        }
        EntDictValue entDictValueDo = new EntDictValue();
        BeanUtils.copyProperties(req, entDictValueDo);
        return dictValueService.updateById(entDictValueDo);
    }

    /**
     * 保存字典表信息
     * @param req 请求参数
     * @return 返回是否保存成功
     */
    @Override
    public boolean saveValue(EntDictValueConfigReq req) {
        if (StrUtil.isBlank(req.getDictCode()) || StrUtil.isBlank(req.getName())) {
            throw new RRException(RRExceptionCodeEnum.PARAM_ERROR);
        }
        // 字典表名称唯一字段
        List<EntDictValue> dictValueList = dictValueService.list(
                new LambdaQueryWrapper<EntDictValue>()
                        .eq(EntDictValue::getDictCode, req.getDictCode())
                        .eq(EntDictValue::getName, req.getName()));

        if (CollectionUtil.isNotEmpty(dictValueList)) {
            throw new RRException(RRExceptionCodeEnum.ENT_DICT_VALUE_EXIST);
        }

        EntDictValue entDictValueDo = new EntDictValue();
        BeanUtils.copyProperties(req, entDictValueDo);
        entDictValueDo.setValue(entDictValueDo.getName());
        return dictValueService.save(entDictValueDo);
    }

    /**
     * 列表
     * @param req 请求参数
     * @return 字典表值列表
     */
    @Override
    public List<EntDictValueListRes> listValue(EntDictValueReq req) {
        if (StrUtil.isBlank(req.getDictCode())) {
            throw new RRException(RRExceptionCodeEnum.PARAM_ERROR);
        }
        LambdaQueryWrapper<EntDictValue> qw = new LambdaQueryWrapper<>();
        qw.eq(EntDictValue::getDictCode, req.getDictCode());
        qw.orderByAsc(EntDictValue::getOrderId, EntDictValue::getId);
        List<EntDictValue> valueList = dictValueService.list(qw);
        return valueList.stream()
                .map(value -> {
                    EntDictValueListRes res = new EntDictValueListRes();
                    BeanUtils.copyProperties(value, res);
                    return res;
                })
                .collect(Collectors.toList());
    }

    /**
     * 字典表值分页获取
     * @param req 分页请求参数
     */
    @Override
    public PageItemVO<EntDictValueListRes> pagingValue(PageItemDTO<EntDictValueDo> req) {
        Page<EntDictValue> pagePo = new Page<>(req.getPageNum(), req.getPageSize());
        BeanUtils.copyProperties(req,pagePo);
        List<EntDictValue> pagingDO = dictValueService.pagingPo(pagePo, req.getConditions());
        PageItemVO<EntDictValueListRes> pageItemVO = PageItemUtil.toPageItemVO(pagePo, new PageItemVO<>());
        pageItemVO.setRecords(
                pagingDO
                        .stream()
                        .map(
                        entDictValue -> {
                            EntDictValueListRes res = new EntDictValueListRes();
                            BeanUtils.copyProperties(entDictValue, res);
                            return res;
                        }
                ).collect(Collectors.toList()));
        return pageItemVO;
    }

    /**
     * 字典值list获取
     */
    @Override
    public List<EntDictCodeListRes> list() {
        List<EntDictCodeListPo> countListDos = dictValueService.entDictCodeList();
        return countListDos.stream().map(
                countListDo -> {
                    EntDictCodeListRes countListRes = new EntDictCodeListRes();
                    BeanUtils.copyProperties(countListDo, countListRes);
                    return countListRes;
                }
        ).collect(Collectors.toList());
    }
}
